
pub(crate) type RnnWeight = i8;
pub(crate) struct RNN {}

impl RNN {
    pub(crate) fn new() -> RNN {
        RNN {}
    }
}
pub(crate) struct DenseLayer<const N: usize, const M: usize> {
    bias: [RnnWeight; N],
    input_weights: [RnnWeight; M],
    num_inputs: usize,
    num_neurons: usize,
    activation: i32,
}
impl<const N: usize, const M: usize> DenseLayer<N, M> {
    pub(crate) const fn new(
        bias: [RnnWeight; N],
        input_weights: [RnnWeight; M],
        num_inputs: usize,
        num_neurons: usize,
        activation: i32,
    ) -> Self {
        Self {
            bias,
            input_weights,
            num_inputs,
            num_neurons,
            activation,
        }
    }
}

pub(crate) struct GRULayer<const N: usize, const M: usize, const P: usize> {
    bias: [RnnWeight; N],
    input_weights: [RnnWeight; M],
    recurrent_weights: [RnnWeight; P],
    num_inputs: usize,
    num_neurons: usize,
    activation: i32,
}

impl<const N: usize, const M: usize, const P: usize> GRULayer<N, M, P> {
    pub(crate) const fn new(
        bias: [RnnWeight; N],
        input_weights: [RnnWeight; M],
        recurrent_weights: [RnnWeight; P],
        num_inputs: usize,
        num_neurons: usize,
        activation: i32,
    ) -> Self {
        Self {
            bias,
            input_weights,
            recurrent_weights,
            num_inputs,
            num_neurons,
            activation,
        }
    }
}